<?php
/**
 +------------------------------------------------------------------------------
 * mysqli类 驱动
 +------------------------------------------------------------------------------
 * @version 3.0
 * @author  WangXian
 * @package ephp
 * @creation date 2010-8-12
 * @Modified date 2011-1-31 11:42:09
 +------------------------------------------------------------------------------
 */
class db
{
	public $sql='';
	private $_conn = false;
	static private $_db_handle;
	function __construct($db_config='default')
	{
		if(! isset(self::$_db_handle[$db_config]) )
		{
			//echo 'mysqli init...<br />';
			#获取当前数据库配制
			if(false == ( $iconfig = C($db_config, 'db') ) ) show_error('数据库配制文件db.config.php中 '. $db_config .'  未设置。');

			$this->_conn = new mysqli($iconfig['host'], $iconfig['user'], $iconfig['password'], $iconfig['dbname']);
			if(mysqli_connect_errno()) show_error('无法连接到数据库，错误信息: '. mysqli_connect_error());

			$this->_conn->set_charset("utf8");

			// 把mysql连接语柄放到static静态区中
			self::$_db_handle[$db_config] = $this->_conn;
		}
		else $this->_conn = self::$_db_handle[$db_config];
	}

	/**
	 * MYSQL query
	 * @param  String $sql
	 * @return mixed
	 */
	function query($sql)
	{
		$this->sql = $sql;

		#是否记录 SQL log
		if( true == C('sql_log') )
			wlog('SQL-Log-'.date('Y-m-d').'.log', '['. date('H:i:s') .']'.$sql);

		if(true == ( $rs = $this->_conn->query($sql) ) )
		{
			#统计数据库查询次数
			global $run_dbquery_count;
			$run_dbquery_count++; #数据库查询次数

			return $rs;
		}
		else if( C('show_errors') ) throw new ephpException('执行mysqli::query()出现错误: '. $this->_conn->error .'<br />原SQL: '.$sql, 2045);
		else exit('db driver query() error.');
	}
	
	/**
	 * 获取单条记录,返回数据格式array
	 * @param string $sql
	 * @return mixed
	 */
	function fetch_array($sql)
	{
		$this->sql = $sql;
		return $this->query($sql)->fetch_assoc();
	}
	
	/**
	 * 获取多条记录，返回数据格式array
	 * @param string $sql
	 * @return mixed
	 */
	function fetch_arrays($sql)
	{
		$this->sql = $sql;
		$rs = $this->query($sql);
		$data = null;
		while(true == ($row = $rs->fetch_assoc()))
		{
			$data[] = $row;
		}
		$rs->free();
		return $data;
	}
	
	/**
	 * 获取一条记录,以object的方式返回数据
	 * @param string $sql
	 */
	function fetch_object($sql)
	{
		$this->sql = $sql;
		return $this->query($sql)->fetch_object();
	}
	
	/**
	 * 查询多条记录，以objects的方式返回数据
	 * @param string $sql
	 */
	function fetch_objects($sql)
	{
		$this->sql = $sql;
		$rs = $this->query($sql);
		$data = null;
		while(true == ($row = $rs->fetch_object()) )
		{
			$data[] = $row;
		}
		$rs->free();
		return $data;
	}
	
	/** return last insert id。 **/
	public function insert_id()
	{
		return $this->_conn->insert_id;
	}

	/** 影响的行数。 **/
	public function affected_rows()
	{
		return $this->_conn->affected_rows;
	}

	/** 最后执行的sql语句。 **/
	public function getLastSql()
	{
		return $this->sql;
	}
}
/* End of file mysqli.class.php */
/* Location: ./_framework/dbdrivers/mysqli.class.php */